package cn.itcast.jvm.controller;

import cn.itcast.jvm.domain.User;
import cn.itcast.jvm.utils.MetaSpace;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 模拟堆内存溢出以及堆外内存溢出
 * created by zhangtian on 2018/7/28
 */
@RestController
@RequestMapping(value = "/")
public class MemoryController {
    private List<User>  userList = new ArrayList<User>();
    private List<Class<?>> classList = new ArrayList<Class<?>>();

    /**
     * 在IDEA中的启动参数VM options中设置
     * 设置最大堆内存与最小堆内存
     * -Xmx32M -Xms32M
     * 设置JVM自动导出内存溢出报告
     * -XX:+HeapDumpOnOutOfMemoryError
     * -XX:HeapDumpPath=./
     * 一般使用jmap手动导出
     *
     * 导出的报告通过MAT分析溢出原因
     * */
    @GetMapping("heap")
    public String heap() {
        int i = 0;
        while(true) {
            userList.add(new User(i++, UUID.randomUUID().toString()));
        }
    }


    /**
     * 设置初始化元空间大小与最大元空间大小
     * -XX:MetaspaceSize=32M -XX:MaxMetaspaceSize=32M
     * */
    @GetMapping("nonheap")
    public String nonheap() {
        while(true) {
            classList.addAll(MetaSpace.createClasses());
        }
    }
}
